#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <unistd.h>  
#include <arpa/inet.h>  

#define PORT 8888  
#define BUFFER_SIZE 1024  

static int a = 0;
int main() {  
    int sockfd;  
    struct sockaddr_in server_addr, client_addr;  
    socklen_t addr_len;  
    char buffer[BUFFER_SIZE];  

    // 创建 UDP 套接字  
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);  
    if (sockfd < 0) {  
        perror("Socket creation failed");  
        exit(EXIT_FAILURE);  
    }  

    // 设置服务器地址结构  
    memset(&server_addr, 0, sizeof(server_addr));  
    server_addr.sin_family = AF_INET; // IPv4  
    server_addr.sin_addr.s_addr = inet_addr("192.168.137.163"); // 指定 IP 地址  
    server_addr.sin_port = htons(PORT); // 指定端口  

    // 绑定套接字到指定地址和端口  
    if (bind(sockfd, (const struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {  
        perror("Bind failed");  
        close(sockfd);  
        exit(EXIT_FAILURE);  
    }  

    printf("UDP server is running on %s:%d\n", "192.168.137.38", PORT);  

    // 循环接收数据  
    while (1) {  
        addr_len = sizeof(client_addr);  
        ssize_t n = recvfrom(sockfd, buffer, BUFFER_SIZE, 0, (struct sockaddr *)&client_addr, &addr_len);  
        if (n < 0) {  
            perror("Receive failed");  
            close(sockfd);  
            exit(EXIT_FAILURE);  
        }  

        buffer[n] = '\0'; // 确保缓冲区是以 null 结尾的  
        printf("Received message: %s from %s:%d\n",  
               buffer,  
               inet_ntoa(client_addr.sin_addr),  
               ntohs(client_addr.sin_port));  


        // while (1)
        // {
            // if(a % 10 == 0)
            // {
            //     break;
            // }
            memset(buffer, 0, sizeof(buffer));
            sprintf(buffer, "nihao a %d\n", a++);
            /* code */
            int ret =sendto(sockfd, buffer, strlen(buffer), 0, (struct sockaddr *)&client_addr, addr_len);
            if(ret == -1)
            {
                printf("send error!%d\n", ret);

            }
        // }
    }  

    // 关闭套接字  
    close(sockfd);  
    return 0;  
}

// #include <stdio.h>
// #include <sys/types.h>
// #include <sys/stat.h>
// #include <fcntl.h>
// #include <unistd.h>
// #include <string.h>

// int main(int argc, char const *argv[])
// {
//     int fd;
//     fd = open("/dev/spi_serial", O_WRONLY | O_RDONLY);
//     if(fd == -1)
//     {
//         perror("file error");
//         return -1;
//     }

//     char buf[128] = "hello world";
//     char buff[128] = {0};
    
//     while (1)
//     {
//         write(fd, buf, 128);
//         sleep(1);
//         // fgets(buff, 128, stdin);
//         // buff[strlen(buff) - 1] = '\0';
//         // if(strcmp(buff, "quit") == 0)
//         // {
//         //     break;
//         // }
//     }
    
//     close(fd);
//     return 0;
// }

